Given the need to protect network servers, firewalls are employed to ensure that only authorized communications take place with the server. A significant problem facing many client-server applications is that the client runs outside of the firewall, and thus must be able to establish connections with the server through the firewall. In most applications, only a limited set of ports is available on the firewall to facilitate communications between the client and the server. Many applications, such as Common Object Request Broker Architecture (CORBA), and to a limited extent, Remote Method Invocation for Java (RMI), rely on the ability to dynamically open ports within a selected range, such as those ports greater than 1024, to establish communications between the client and the server. Such a configuration puts a severe constraint on the firewall, since it now has to open up all of its ports because it does not know which port will be selected by the applications. In most situations, the server operators are unwilling to take the risk of opening so many ports and leaving a relatively large number of openings into their server. Accordingly, there is a need for a way to effectively tunnel through a firewall using a restricted number of ports in an efficient and effective manner, without requiring significant modification to existing client and server applications.